package com.woniuxy.service.impl;

import com.woniuxy.entity.ComCommentLikes;
import org.springframework.stereotype.Service;
import com.woniuxy.entity.ComComment;
import com.woniuxy.mapper.ComCommentMapper;
import com.woniuxy.service.ComCommentService;
import org.springframework.beans.factory.annotation.Autowired;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

@Service
public class ComCommentServiceImpl implements ComCommentService {
    @Autowired
    private ComCommentMapper comCommentMapper;
    //@Autowired
    //private RedisTemplate<String, Object> redisTemplate;

    /**
     * 根据社区ID获取评论列表
     */
    @Override
    public List<ComComment> getCommentsByCommunityId(Integer communityId) {
        List<ComComment> comments = comCommentMapper.selectCommentsByCommunityId(communityId);
        // 1. 构建所有节点的映射表
        // - 目的：将O(n²)的遍历查找优化为O(1)的哈希查找
        // - 原理：Map的get/put操作平均时间复杂度为O(1)
        Map<Integer, ComComment> commentMap = new HashMap<>();

        for (ComComment comment : comments) {
            // 将每条评论放入Map，键为commentId，值为评论对象本身
            // 例如：{1: 评论1, 2: 评论2, 3: 评论3}
            commentMap.put(comment.getCommentId(), comment);
        }
        // 2. 存储根评论（即parentId为null的顶级评论）
        List<ComComment> rootComments = new ArrayList<>();
        // 3. 第二次遍历：构建树形结构
        for (ComComment comment : comments) {
            // 获取当前评论的父ID
            Integer parentId = comment.getParentId();

            // 3.1 如果父ID为null，说明是根评论
            if (parentId == null) {
                rootComments.add(comment);
                continue; // 跳过后续逻辑，处理下一条评论
            }

            // 3.2 如果不是根评论，尝试从Map中查找父评论
            // 关键优化：直接通过Map.get(parentId)定位父评论，无需遍历列表
            ComComment parent = commentMap.get(parentId);

            // 3.3 安全检查：确保父评论存在（避免数据异常导致的空指针）
            if (parent != null) {
                // 3.4 初始化父评论的子评论列表（如果为空）
                if (parent.getReplies() == null) {
                    parent.setReplies(new ArrayList<>());
                }

                // 3.5 将当前评论添加为父评论的子评论
                parent.getReplies().add(comment);
            }
        }

        // 返回根评论列表（已包含完整的树形结构）
        return rootComments;

    }


    /**
     *  获取热门评论
     */
    // 获取热门评论
    @Override
    public List<ComComment> getHotComments() {


//        String cacheKey =  ":hot_comments";
//        List<ComComment> cachedComments = (List<ComComment>) redisTemplate.opsForValue().get(cacheKey);
//
//        if (cachedComments != null) {
//            return cachedComments;
//        }
//
//        // 从数据库查询并缓存
//        List<ComComment> hotComments = comCommentMapper.selectTopLevelComments(limit);
//        redisTemplate.opsForValue().set(cacheKey, hotComments, 5, TimeUnit.MINUTES);

        return comCommentMapper.getHotComments();
    }

    @Override
    public void decrementLikesCount(Integer userId, Integer commentId) {
        comCommentMapper.decrementLikesCount(commentId);
        comCommentMapper.removeCommentLike(commentId, userId);
    }

    @Override
    public List<ComCommentLikes> getUserLikeComment(Integer userId) {
        return comCommentMapper.getUserLikeComment(userId);
    }

    /**
     * 点赞功能
     */
    @Override
    public void incrementLikesCount(Integer userId, Integer commentId){
        comCommentMapper.incrementLikesCount(commentId);
        comCommentMapper.addCommentLike(commentId, userId);
//        String likeKey = "comment:" + commentId + ":likes";
//
//        String topLikesKey = "comments:top_likes";
//
//        Long added = redisTemplate.opsForSet().add(likeKey, userId);
//
//        if (added != null && added == 1) {
//            // 点赞计数 +1
//            redisTemplate.opsForZSet().incrementScore(topLikesKey, commentId, 1);
//
//            // 异步更新数据库（保证最终一致性）
//            CompletableFuture.runAsync(() -> comCommentMapper.incrementLikesCount(commentId));
//        }
    }


    @Override
    public void insertComment(ComComment comment) {
         comCommentMapper.insertComment(comment);
    }



}
